﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace FrbaCommerce.Abm_Cliente
{
    public partial class frm_modificarCliente : Form
    {
        private DataRow clienteOriginal;
        private bool tipoNroDocValido = false;
        private bool telefonoCliValido = false;
        private bool cuilValido = false;
        private bool camposObligatorios = false;

        public frm_modificarCliente(DataGridViewRow cliente)
        {
            InitializeComponent();
            clienteOriginal = (cliente.DataBoundItem as DataRowView).Row;
        }

        private void frm_modificarCliente_Load(object sender, EventArgs e)
        {
            //---Cargar TextBox Nombre de Usuario y Contraseña---//
            BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandText = "SELECT USERNAME, PASSWORD FROM LOS_GDDES.USUARIOS " +
                                     "WHERE ID_USUARIO=@id_usuario";
            sqlCommand.CommandType = CommandType.Text;
            sqlCommand.Parameters.AddWithValue("id_usuario", clienteOriginal.Field<Decimal>("ID_USUARIO"));
            DataTable dt_usuario = baseDeDatos.consulta(sqlCommand);
            txt_nombreDeUsuario.Text = dt_usuario.Rows[0][0].ToString();
            txt_contrasenia.Text = dt_usuario.Rows[0][1].ToString();
            //---Cargar TextBox Nombre de Usuario y Contraseña---//

            //---Cargar TextBox---//
            txt_nombreCliente.Text = clienteOriginal.Field<string>("NOMBRE");
            txt_apellidoCliente.Text = clienteOriginal.Field<string>("APELLIDO");
            sqlCommand.CommandText = "LOS_GDDES.SP_TRAER_TIPOS_DOCUMENTO";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.Parameters.Clear();
            DataTable dt_tiposDocumento = baseDeDatos.consulta(sqlCommand);
            cmb_tipoDocCliente.DataSource = dt_tiposDocumento;
            cmb_tipoDocCliente.DisplayMember = "DESCRIPCION";
            cmb_tipoDocCliente.ValueMember = "ID_TIPO_DOC";
            cmb_tipoDocCliente.SelectedValue = clienteOriginal.Field<Decimal>("ID_TIPO_DOC");
            txt_nroDoc.Text = Convert.ToString(clienteOriginal.Field<Decimal>("NRO_DOC"));
            txt_emailCliente.Text = clienteOriginal.Field<string>("MAIL");
            txt_telCliente.Text = Convert.ToString(clienteOriginal.Field<Decimal>("TELEFONO"));
            txt_dirCliente.Text = clienteOriginal.Field<string>("DIRECCION_NOMBRE");
            txt_nroDirCliente.Text = Convert.ToString(clienteOriginal.Field<Decimal>("DIRECCION_NRO"));
            if(clienteOriginal.Field<object>("NRO_PISO") != null)
                txt_pisoDirCliente.Text = Convert.ToString(clienteOriginal.Field<Decimal>("NRO_PISO"));
            if (clienteOriginal.Field<object>("DEPTO") != null)
                txt_dptoDirCliente.Text = clienteOriginal.Field<string>("DEPTO");
            txt_localidadCliente.Text = clienteOriginal.Field<string>("LOCALIDAD");
            txt_CPCliente.Text = clienteOriginal.Field<string>("COD_POSTAL");
            if (clienteOriginal.Field<object>("CUIL") != null)
                txt_cuilCliente.Text = clienteOriginal.Field<string>("CUIL");
            dtp_fecNacCliente.Text = Convert.ToString(clienteOriginal.Field<DateTime>("FECHA_NAC"));
            //---Cargar TextBox---//
        }

        private void lbl_cambiarContrasenia_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            frm_cambiarContrasenia frm_cambiarContrasenia = new frm_cambiarContrasenia(clienteOriginal.Field<Decimal>("ID_USUARIO"));
            frm_cambiarContrasenia.ShowDialog();
            this.frm_modificarCliente_Load(sender, e);
        }

        private void txt_nroDoc_Leave(object sender, EventArgs e)
        {
            validar_nroDocCli();
        }

        private void validar_nroDocCli()
        {
            if (txt_nroDoc.Text == "")
            {
                txt_nroDoc.BackColor = Color.Red;
                tipoNroDocValido = false;
            }
            else if ((txt_nroDoc.Text == Convert.ToString(clienteOriginal.Field<Decimal>("NRO_DOC"))) && (Convert.ToDecimal(cmb_tipoDocCliente.SelectedValue) == clienteOriginal.Field<Decimal>("ID_TIPO_DOC")) && txt_nroDoc.Text != "-1")
            {
                txt_nroDoc.BackColor = Color.White;
                tipoNroDocValido = true;
            }
            else
            {
                BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_CLIENTE_TIPO_NRO_DOC";
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@id_tipo_doc", Convert.ToInt32(cmb_tipoDocCliente.SelectedValue));
                sqlCommand.Parameters.AddWithValue("@nro_doc", Convert.ToInt32(txt_nroDoc.Text));
                int tipoNroDocExistente = baseDeDatos.ejecuta(sqlCommand);

                if (tipoNroDocExistente > 0)
                {
                    txt_nroDoc.BackColor = Color.Red;
                    tipoNroDocValido = false;
                }
                else
                {
                    txt_nroDoc.BackColor = Color.White;
                    tipoNroDocValido = true;
                }
            }
        }

        private void txt_telCliente_Leave(object sender, EventArgs e)
        {
            validar_telCli();
        }

        private void validar_telCli()
        {
            if (txt_telCliente.Text == "")
            {
                txt_telCliente.BackColor = Color.Red;
                telefonoCliValido = false;
            }
            else if (txt_telCliente.Text == Convert.ToString(clienteOriginal.Field<Decimal>("TELEFONO")) && txt_telCliente.Text != "-1")
            {
                txt_telCliente.BackColor = Color.White;
                telefonoCliValido = true;
            }
            else
            {
                BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_CLIENTE_TELEFONO";
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@telefono", Convert.ToInt32(txt_telCliente.Text));
                int telefonoCliExistente = baseDeDatos.ejecuta(sqlCommand);

                if (telefonoCliExistente > 0)
                {
                    txt_telCliente.BackColor = Color.Red;
                    telefonoCliValido = false;
                }
                else
                {
                    txt_telCliente.BackColor = Color.White;
                    telefonoCliValido = true;
                }
            }
        }

        private void txt_cuilCliente_Leave(object sender, EventArgs e)
        {
            validar_cuilCli();
        }

        private void validar_cuilCli()
        {
            bool cuil_formato_valido = FuncionesUtiles.validateCuit(txt_cuilCliente.Text);
            if (txt_cuilCliente.Text != "")
            {
                if (txt_cuilCliente.Text == clienteOriginal.Field<string>("CUIL") && cuil_formato_valido && txt_cuilCliente.Text != "INVAL")
                {
                    txt_cuilCliente.BackColor = Color.White;
                    cuilValido = true;
                }
                else if (cuil_formato_valido == true)
                {
                    BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                    SqlCommand sqlCommand = new SqlCommand();
                    sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_CLIENTE_CUIL";
                    sqlCommand.CommandType = CommandType.StoredProcedure;
                    sqlCommand.Parameters.AddWithValue("@cuil", txt_cuilCliente.Text);
                    int cuilCliExistente = baseDeDatos.ejecuta(sqlCommand);

                    if (cuilCliExistente > 0)
                    {
                        txt_cuilCliente.BackColor = Color.Red;
                        cuilValido = false;
                    }
                    else
                    {
                        txt_cuilCliente.BackColor = Color.White;
                        cuilValido = true;
                    }
                }
                else
                {
                    txt_cuilCliente.BackColor = Color.Red;
                    cuilValido = false;
                }
            }
            else
            {
                txt_cuilCliente.BackColor = Color.White;
                cuilValido = true;
            }
        }

        //---Validar Campos Obligatorios Completos---//
        private void verificar_campos_obligatorios()
        {
            var camposObligatorios = new List<Control>();
            camposObligatorios.Add(txt_nombreCliente);
            camposObligatorios.Add(txt_apellidoCliente);
            camposObligatorios.Add(txt_nroDoc);
            camposObligatorios.Add(txt_emailCliente);
            camposObligatorios.Add(txt_telCliente);
            camposObligatorios.Add(txt_dirCliente);
            camposObligatorios.Add(txt_nroDirCliente);
            camposObligatorios.Add(txt_localidadCliente);
            camposObligatorios.Add(txt_CPCliente);
            camposObligatorios.Add(dtp_fecNacCliente);
            camposObligatorios.Add(cmb_tipoDocCliente);

            if (camposObligatorios.All<Control>(campos => campos.Text != "" && campos.Text != "INVAL" && campos.Text != "-1"))
                this.camposObligatorios = true;
            else
                this.camposObligatorios = false;

            var camposIncompletos = camposObligatorios.FindAll(campos => campos.Text == "" || campos.Text == "INVAL" || campos.Text == "-1");
            camposIncompletos.ForEach(campos => campos.BackColor = Color.Red);
            var camposCompletos = camposObligatorios.FindAll(campos => campos.Text != "" && campos.Text != "INVAL" && campos.Text != "-1");
            camposCompletos.ForEach(campos => campos.BackColor = Color.White);
        }
        //---Validar Campos Obligatorios Completos---//

        private void btn_guardar_Click(object sender, EventArgs e)
        {
            this.verificar_campos_obligatorios();
            this.validar_telCli();
            this.validar_cuilCli();
            this.validar_nroDocCli();

            if (tipoNroDocValido && telefonoCliValido && cuilValido && camposObligatorios)
            {
                this.actualizar_cliente();
                this.Close();
            }
        }

        private void btn_limpiar_Click(object sender, EventArgs e)
        {
            this.Controls.OfType<GroupBox>().ToList().ForEach(groupBox => groupBox.Controls.OfType<TextBox>().ToList().ForEach(textBox => textBox.Text = String.Empty));
        }

        private void btn_cancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void actualizar_cliente()
        {
            BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandText = "LOS_GDDES.SP_MODIFICAR_CLIENTE";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.Parameters.AddWithValue("@id_cliente", clienteOriginal.Field<Decimal>("ID_CLIENTE"));
            sqlCommand.Parameters.AddWithValue("@nombre", txt_nombreCliente.Text);
            sqlCommand.Parameters.AddWithValue("@apellido", txt_apellidoCliente.Text);
            sqlCommand.Parameters.AddWithValue("@id_tipo_doc", Convert.ToInt32(cmb_tipoDocCliente.SelectedValue)); //Cambiar
            sqlCommand.Parameters.AddWithValue("@nro_doc", Convert.ToInt32(txt_nroDoc.Text));
            sqlCommand.Parameters.AddWithValue("@mail", txt_emailCliente.Text);
            sqlCommand.Parameters.AddWithValue("@telefono", Convert.ToInt32(txt_telCliente.Text));
            sqlCommand.Parameters.AddWithValue("@direccion_nombre", txt_dirCliente.Text);
            sqlCommand.Parameters.AddWithValue("@direccion_nro", Convert.ToInt32(txt_nroDirCliente.Text));
            if (txt_pisoDirCliente.Text != "")
                sqlCommand.Parameters.AddWithValue("@nro_piso", Convert.ToInt32(txt_pisoDirCliente.Text));
            if (txt_dptoDirCliente.Text != "")
                sqlCommand.Parameters.AddWithValue("@depto", txt_dptoDirCliente.Text);
            sqlCommand.Parameters.AddWithValue("@localidad", txt_localidadCliente.Text);
            sqlCommand.Parameters.AddWithValue("@cod_postal", txt_CPCliente.Text);
            if(txt_cuilCliente.Text != "")
                sqlCommand.Parameters.AddWithValue("@cuil", txt_cuilCliente.Text);
            sqlCommand.Parameters.AddWithValue("@fecha_nac", Convert.ToDateTime(dtp_fecNacCliente.Text));
            baseDeDatos.ejecuta(sqlCommand);
        }

        private void txt_nroDoc_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_telCliente_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_nroDirCliente_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_pisoDirCliente_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_CPCliente_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }
    }
}
